package com.xdb.sqlparser.visitor;

import com.xdb.sqlparser.ast.expr.SQLBinaryOpExpr;
import com.xdb.sqlparser.ast.expr.SQLCharExpr;
import com.xdb.sqlparser.ast.expr.SQLInListExpr;
import com.xdb.sqlparser.ast.expr.SQLIntegerExpr;
import com.xdb.sqlparser.ast.expr.SQLNCharExpr;
import com.xdb.sqlparser.ast.expr.SQLNullExpr;
import com.xdb.sqlparser.ast.expr.SQLNumberExpr;
import com.xdb.sqlparser.util.ParameterizedOutputVisitorUtils;

public class SQLParameterizedOutputVisitor extends SQLAstOutputVisitor implements SQLParameterizedVisitor {

	private int replaceCount;

	public SQLParameterizedOutputVisitor() {
		this(new StringBuilder());
	}

	public SQLParameterizedOutputVisitor(Appendable appender) {
		super(appender);
	}

	public int getReplaceCount() {
		return this.replaceCount;
	}

	public void incrementReplaceCunt() {
		replaceCount++;
	}

	public boolean visit(SQLInListExpr x) {
		return ParameterizedOutputVisitorUtils.visit(this, x);
	}

	public boolean visit(SQLBinaryOpExpr x) {
		x = ParameterizedOutputVisitorUtils.merge(this, x);

		return super.visit(x);
	}

	public boolean visit(SQLIntegerExpr x) {
		if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
			return super.visit(x);
		}

		return ParameterizedOutputVisitorUtils.visit(this, x);
	}

	public boolean visit(SQLNumberExpr x) {
		if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
			return super.visit(x);
		}

		return ParameterizedOutputVisitorUtils.visit(this, x);
	}

	public boolean visit(SQLCharExpr x) {
		if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
			return super.visit(x);
		}

		return ParameterizedOutputVisitorUtils.visit(this, x);
	}

	public boolean visit(SQLNCharExpr x) {
		if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
			return super.visit(x);
		}

		return ParameterizedOutputVisitorUtils.visit(this, x);
	}

	public boolean visit(SQLNullExpr x) {
		if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
			return super.visit(x);
		}

		return ParameterizedOutputVisitorUtils.visit(this, x);
	}

}
